home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1995 October / EnigmA AMIGA RUN 01 (1995)(G.R. Edizioni)(IT)[!][issue 1995-10][Aminet 7].iso / Aminet / comm / tcp / AmigaTCP.lha / AmigaTCP / src / smisc.c < prev    next >
C/C++ Source or Header  |  1989-06-24  |  2KB  |  133 lines

  1. /* Miscellaneous servers */
  2. #include <stdio.h>
  3. #include "machdep.h"
  4. #include "mbuf.h"
  5. #include "netuser.h"
  6. #include "timer.h"
  7. #include "tcp.h"
  8.  
  9. static struct tcb *disc_tcb,*echo_tcb;
  10. /* Start up discard server */
  11. discard_start(argc,argv)
  12. int argc;
  13. char *argv[];
  14. {
  15.     struct socket lsocket;
  16.     void r_discard(),t_state(),t_state();
  17.  
  18.     lsocket.address = ip_addr;
  19.     if(argc < 2)
  20.         lsocket.port = 9;
  21.     else
  22.         lsocket.port = atoi(argv[1]);
  23.     disc_tcb = open_tcp(&lsocket,NULLSOCK,TCP_PASSIVE,0,r_discard,NULLVFP,t_state,0);
  24. }
  25. /* Start echo server */
  26. echo_start(argc,argv)
  27. int argc;
  28. char *argv[];
  29. {
  30.     void r_echo(),t_echo(),t_state();
  31.     struct socket lsocket;
  32.  
  33.     lsocket.address = ip_addr;
  34.     if(argc < 2)
  35.         lsocket.port = 7;
  36.     else
  37.         lsocket.port = atoi(argv[1]);
  38.     echo_tcb = open_tcp(&lsocket,NULLSOCK,TCP_PASSIVE,0,r_echo,t_echo,t_state,0);
  39.  
  40. }
  41.  
  42. /* Shut down miscellaneous servers */
  43. discard_stop()
  44. {
  45.     if(disc_tcb != NULLTCB)
  46.         close_tcp(disc_tcb);
  47. }
  48. echo_stop()
  49. {
  50.     if(echo_tcb != NULLTCB)
  51.         close_tcp(echo_tcb);
  52. }
  53.  
  54. /* Discard server receiver upcall */
  55. static
  56. void
  57. r_discard(tcb,cnt)
  58. struct tcb *tcb;
  59. int cnt;
  60. {
  61.     struct mbuf *bp;
  62.  
  63.     if(recv_tcp(tcb,&bp,cnt) > 0)
  64.         free_p(bp);            /* Discard */
  65. }
  66.  
  67. /* Echo server receive
  68.  * Copies only as much will fit on the transmit queue
  69.  */
  70. static
  71. void
  72. r_echo(tcb,cnt)
  73. struct tcb *tcb;
  74. int cnt;
  75. {
  76.     struct mbuf *bp;
  77.     int acnt;
  78.  
  79.     if(cnt == 0){
  80.         close_tcp(tcb);
  81.         return;
  82.     }
  83.     acnt = min(cnt,tcb->snd.wnd);
  84.     if(acnt > 0){
  85.         /* Get only as much will fit in the send window */
  86.         recv_tcp(tcb,&bp,tcb->snd.wnd);
  87.         send_tcp(tcb,bp);
  88.     }
  89. }
  90. /* Echo server transmit
  91.  * Copies anything that might have been left in the receiver queue
  92.  */
  93. static
  94. void
  95. t_echo(tcb,cnt)
  96. struct tcb *tcb;
  97. int cnt;
  98. {
  99.     struct mbuf *bp;
  100.  
  101.     if(tcb->rcvcnt > 0){
  102.         /* Get only as much will fit in the send window */
  103.         recv_tcp(tcb,&bp,cnt);
  104.         send_tcp(tcb,bp);
  105.     }
  106. }
  107.  
  108. /* Log connection state changes; also respond to remote closes */
  109. static
  110. void
  111. t_state(tcb,old,new)
  112. register struct tcb *tcb;
  113. char old,new;
  114. {
  115.     switch(new){
  116.     case ESTABLISHED:
  117.         log(tcb,"open %d",tcb->conn.local.port);
  118.         break;
  119.     case CLOSE_WAIT:
  120.         close_tcp(tcb);
  121.         break;
  122.     case CLOSED:
  123.         log(tcb,"close %d",tcb->conn.local.port);
  124.         del_tcp(tcb);
  125.         /* Clean up if server is being shut down */
  126.         if(tcb == disc_tcb)
  127.             disc_tcb = NULLTCB;
  128.         else if(tcb == echo_tcb)
  129.             echo_tcb = NULLTCB;
  130.         break;
  131.     }
  132. }
  133.